/**
 * @brief 字节序操作函数(大端/小端)
 */

#ifndef __ENDIAN_H__
#define __ENDIAN_H__

// Done

#define SYLAR_LITTLE_ENDIAN 1
#define SYLAR_BIG_ENDIAN 2

#include <byteswap.h>
#include <stdint.h>
#include <type_traits>

// 8字节类型的字节序转化
// std::enable_if<condition, type>
// typename ... ::type：这是一个类型选择器，用于从 std::enable_if 中选择类型。如果条件为真，则选择 type，否则不选择任何类型。

template <class T>
typename std::enable_if<sizeof(T) == sizeof(uint64_t), T>::type
byteswap(T value)
{
    return (T)bswap_64((uint64_t)value);
}

// 4字节类型的字节序转换
template <class T>
typename std::enable_if<sizeof(T) == sizeof(uint32_t), T>::type
byteswap(T value)
{
    return (T)bswap_32((uint32_t)value);
}

// 2字节类型的字节序转换
template <class T>
typename std::enable_if<sizeof(T) == sizeof(uint16_t), T>::type
byteswap(T value)
{
    return (T)bswap_16((uint16_t)value);
}

#if BYTE_ORDER == BIG_ENDIAN
#define SYLAR_BYTE_ORDER SYLAR_BIG_ENDIAN
#else
#define SYLAR_BYTE_ORDER SYLAR_LITTLE_ENDIAN
#endif

#if SYLAR_BYTE_ORDER == SYLAR_BIG_ENDIAN
// 只在小端机器上执行byteswap,在大端机上什么都不做
template <class T>
T byteswapOnLittleEndian(T t)
{
    return t;
}

// 只在大端机器上执行byteswap,在小端机上什么都不做
template <class T>
T byteswapOnBigEndian(T t)
{
    return byteswap(t);
}
#else

// 只在小端机器上执行byteswap,在大端机上什么都不做
template <class T>
T byteswapOnLittleEndian(T t)
{
    return byteswap(t);
}

// 只在大端机器上执行byteswap,在小端机上什么都不做
template <class T>
T byteswapOnBigEndian(T t)
{
    return t;
}
#endif

#endif